package br.ufpe.cin.mac.middleware.autonomic.monitors;

import java.io.IOException;

/**
 * @author Rafael Roque
 * @author Osmany
 */
public class ProcessorMonitor extends Monitor {

	/*
	 * Platform-specific management interface for the 
	 * operating system on which the Java virtual machine is running.
	 */
	com.sun.management.OperatingSystemMXBean sunOSMBean;
	
	/**
	 * Constructor
	 * 
	 * @throws IOException
	 */
	public ProcessorMonitor() throws IOException{
		super(ProcessorMonitor.class.getName());
		sunOSMBean = JMXUtil.getOsMBean();		
	}
	
	/**
	 * Returns the system load average for the last minute. 
	 * The system load average is the sum of the number of runnable 
	 * entities queued to the available processors and the number of 
	 * runnable entities running on the available processors averaged 
	 * over a period of time. The way in which the load average is 
	 * calculated is operating system specific but is typically a damped 
	 * time-dependent average. 
	 * 
	 * If the load average is not available, a negative value is returned. 
	 * 
	 * This method is designed to provide a hint about the system load 
	 * and may be queried frequently. The load average may be unavailable 
	 * on some platform where it is expensive to implement this method. 
	 * 
	 * @return the system load average; or a negative value if not available.
	 */	
	private double getCpuUsage(){
		double load = sunOSMBean.getSystemLoadAverage();
		if(load != -1){
			return load;
		}else{
			//TODO Verificar como pegar essa informacao no WIndows
			return 0;
		}
		
	}
	
	/* (non-Javadoc)
	 * @see br.ufpe.cin.mac.middleware.autonomic.monitors.Monitor#getMonitoredValue()
	 */
	@Override
	public float getMonitoredValue() {
		return (float) this.getCpuUsage();
	}
	/**
	 * Test this class
	 * 
	 * @param args
	 */
	public static void main (String args[]){
		ProcessorMonitor p = null;
		try {
			p = new ProcessorMonitor();
		} catch (IOException e) {			
			e.printStackTrace();
			return;
		}
		for(int i = 0; i < 100; i++){
			System.out.println("CPU Usage - " + p.getCpuUsage());
			try {
				for(int j = 0; j < 100; j++){
					Math.pow(34, 120);
				}
				Thread.sleep(10000);
			} catch (InterruptedException e) {				
				e.printStackTrace();
			}
		}
	}

	
}
